perm filename SCHEME.VLI[VLI,LSP] blob
sn#382058 filedate 1978-09-08 generic text, type T, neo UTF8
(DE CADDAR (X) (CADDR (CAR X)))
(SETQ QUANTUM -50)
(DF DA (1X) (PUT (NEXTL 1X) (CONS LAMBDA 1X) 'AINT))
(DE SCHEME ()
(SETQ *ENV* NIL QUEUE NIL *PROCESS* (CREATEPROCESS '(TOP 'TOPLEVEL)))
(SWAPIN)
(SETQ CLOCK QUANTUM)
(MLOOP))
(DE MLOOP ()
(SETQ TICK NIL)
(WHILE T (AND TICK (ALLOW) (SCHEDULE))
(CLOCK)
(APPLY *PC* NIL)))
(SETQ TOP '(BETA (LAMBDA (MESSAGE)
(LABELS
((TOP1 (LAMBDA (X) (TOP1 (PRINT (EVALUATE (READ))) ))))
(TOP1 (PRINT MESSAGE)))) NIL))
(DE SAVEUP (RETAG)
(SETQ *CLINK* [*EXP* *UNL* *ENV* *EVL* RETAG *CLINK*]))
(DE RESTORE ()
(IF *CLINK* (MAPC '(*EXP* *UNL* *ENV* *EVL* *PC* *CLINK*)
'(LAMBDA (1X) (SET 1X (NEXTL *CLINK*))))
(ERROR 2)))
(DE ALLOW (;; VCELL)
(SETQ VCELL (ASSQ '*ALLOW* *ENV*))
(IF VCELL (CADR VCELL) T))
(DE CLOCK ()
(INCR CLOCK) (AND (GZP CLOCK) (SETQ TICK T)))
(DE SCHEDULE ()
(IF QUEUE (PROGN (SWAPOUT) (NCONC1 QUEUE *PROCESS*)
(SETQ *PROCESS* (NEXTL QUEUE)) (SWAPIN)))
(SETQ TICK NIL CLOCK QUANTUM))
(DE SWAPOUT ()
((LAMBDA (*CLINK*) (PUT *PROCESS* (SAVEUP *PC*) 'CLINK)
(PUT *PROCESS* *VAL* 'VAL))
*CLINK*))
(DE SWAPIN ()
(SETQ *CLINK* (GET *PROCESS* 'CLINK) *VAL* (GET *PROCESS* 'VAL))
(RESTORE))
(DE PRIMOP (X) (MEMQ (TYPEFN X) '(EXPR SUBR)))
(DE AEVAL () (COND
((ATOM *EXP*) (COND
((OR (NUMBP *EXP*) (PRIMOP *EXP*))
(SETQ *VAL* *EXP*) (RESTORE))
((SETQ TEM (ASSQ *EXP* *ENV*))
(SETQ *VAL* (CADR TEM)) (RESTORE))
(T (SETQ *VAL* (CAR *EXP*)) (RESTORE))))
((ATOM (SETQ 1X (CAR *EXP*)))
(COND
((= 1X LAMBDA) (SETQ *VAL* ['BETA *EXP* *ENV*]) (RESTORE))
((ATOM (CDR 1X)) (SETQ *EVL* NIL *UNL* *EXP* *PC* 'AEVLIS))
((SETQ TEM (GET 1X 'AINT)) (SETQ *PC* TEM))
((SETQ TEM (GET 1X 'AMACRO)) (SETQ *EXP* (APPLY TEM (CONS *EXP*))))
(T (SETQ *EVL* NIL *UNL* *EXP* *PC* 'AEVLIS))))
((= (CAAR *EXP*) LAMBDA) (SETQ *EVL* (LIST 1X) *UNL* (CDR *EXP*)
*PC* 'AEVLIS))
(T (SETQ *EVL* NIL *UNL* *EXP* *PC* 'AEVLIS)) ))